import pandas as pd
import subprocess

# 加载Excel文件
file_path = "D:\software\Desktop\Ollama_damo\extracted_triples.xlsx"  # 替换为你的文件路径
df = pd.read_excel(file_path)

# 打印列名，检查数据是否加载正确
print(df.columns)


# 定义清洗无效数据的过滤规则
def clean_text(text):
    # 定义无效信息的关键词列表
    invalid_keywords = [
        "暂无", "暂无点评", "暂无相关信息", "无", "没有", "未知", "不详", "无信息", "未填写", "暂未开放", "无数据"
    ]

    # 将文本转换为小写并检查是否包含无效关键词
    text = str(text).lower()

    # 如果包含无效关键词，返回空字符串
    for keyword in invalid_keywords:
        if keyword.lower() in text:
            return ""

    return text


# 定义调用本地 Ollama 提取三元组的函数
def extract_triples_with_ollama(text):
    try:
        # 使用 subprocess 调用本地的 Ollama 命令行接口
        command = [
            'ollama', 'run', 'qwen2', '--input', text  # 运行本地的 Ollama Qwen2 模型
        ]

        # 执行命令并获取输出
        result = subprocess.run(command, capture_output=True, text=True)

        # 检查命令是否执行成功
        if result.returncode == 0:
            return result.stdout  # 返回提取到的三元组
        else:
            print(f"Error: {result.stderr}")
            return None
    except Exception as e:
        print(f"An error occurred: {e}")
        return None


# 创建一个空的列表来存储所有的三元组
triples_list = []

# 提取每一行的三元组
for index, row in df.iterrows():
    # 景点全称作为主键
    spot_title = row['title']  # 假设 'title' 是景点全称的列

    # 对每一列生成三元组 (景点名称, 列名, 列的值)
    for column in df.columns[1:]:  # 从第二列开始（忽略第一列 title）
        text = str(row[column])  # 读取每个列的内容并转换为字符串

        # 清洗文本内容，去除无效信息
        cleaned_text = clean_text(text)

        if cleaned_text:  # 如果文本不为空，说明它包含有效信息
            # 将每个列的信息与景点名称组合成三元组 (景点名称, 列名, 列内容)
            triple = (spot_title, column, cleaned_text)
            triples_list.append({
                'title': spot_title,
                'triple': triple  # 将三元组存储
            })

# 将清洗后的三元组保存为新的 DataFrame
triples_df = pd.DataFrame(triples_list)

# 保存提取的三元组到新的 Excel 文件
output_path = "cleaned_extracted_triples.xlsx"
triples_df.to_excel(output_path, index=False)

print(f"清洗后的三元组已保存到 {output_path}")
